/*
 * @lc app=leetcode.cn id=3 lang=golang
 * @lcpr version=30118
 *
 * [3] 无重复字符的最长子串
 */

// @lcpr-template-start

// @lcpr-template-end
// @lc code=start
func lengthOfLongestSubstring(s string) int {

	ans := 0

	// 用于存储字符的索引
	m := make(map[byte]int)
	i, j := 0, 0
	for ; j < len(s); j++ {
		if v, ok := m[s[j]]; ok {
			ans = max(ans, j-i)

			// m 需要删除 [i,v] 之间的字符
			for k := i; k <= v; k++ {
				delete(m, s[k])
			}

			i = v + 1
		}
		m[s[j]] = j
	}

	ans = max(ans, j-i)

	return ans

}

// @lc code=end

/*
// @lcpr case=start
// "abcabcbb"\n
// @lcpr case=end

// @lcpr case=start
// "bbbbb"\n
// @lcpr case=end

// @lcpr case=start
// "pwwkew"\n
// @lcpr case=end

*/

